#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>

using namespace std;


//int myAtoi(string str) {
//    int boundary = INT_MAX / 10;
//    int i = 0, flag = 1;
//    long long int ans = 0;
//    //int ans = 0;
//    while (str[i] == ' ')
//        if (str[++i] == '\0')
//            return 0;
//    if (str[i] == '-')
//        flag = -1;
//    if (str[i] == '-' || str[i] == '+')
//        ++i;
//    for (int j = i; j < str.size(); j++)
//    {
//        if (str[j] > '9' || str[j] < '0')
//            break;
//        ans = ans * 10 + str[j] - '0';
//        if (ans * flag > INT_MAX || ans * flag < INT_MIN)
//        {
//            return flag == 1 ? INT_MAX : INT_MIN;
//        }
//
//        /*if (ans > boundary || ans == boundary && str[j] > '7' && flag == 1 || ans == boundary && str[j] > '8' && flag == -1)
//        {
//            return flag == 1 ? INT_MAX : INT_MIN;
//        }
//        ans = ans * 10 + str[j] - '0';*/
//    }
//    return ans * flag;
//}


int myAtoi(string str) {
    int boundary = INT_MAX / 10;
    int i = 0, flag = 1, ans = 0;
    while (str[i] == ' ')
        if (str[++i] == '\0')
            return 0;
    if (str[i] == '-')
        flag = -1;
    if (str[i] == '-' || str[i] == '+')
        ++i;
    for (int j = i; j < str.size(); j++) {
        if (str[j] > '9' || str[j] < '0')
            break;

        if (ans > boundary || ans == boundary && str[j] > '7' && flag == 1 || ans == boundary && str[j] > '8' && flag == -1)
        {
            return flag == 1 ? INT_MAX : INT_MIN;
        }
        ans = ans * 10 + str[j] - '0';
    }
    return ans * flag;
}


int main()
{
    string str("2147483646");
    int i = myAtoi(str);
    cout << i << endl;
    return 0;
}

